package cc.owoo.godpen.analysis.css;

import cc.owoo.godpen.analysis.html.Element;

import java.util.LinkedList;
import java.util.Queue;

/**
 * 选择器节点
 * Created by nimensei
 * 2022-06-01 上午 12:40
 */
public abstract class SelectorNode {
    /**
     * 对元素的子元素进行选择，把选择结果添加到元素列表中
     *
     * @param element  需要进行子元素选择的元素
     * @param elements 选择之后的结果
     */
    public void select(Element element, LinkedList<Element> elements) {
        if (element == null || elements == null)
            return;
        selectElement(element, elements);
    }

    /**
     * 仅对元素本身进行选择，如果匹配则添加到元素列表中，否则不做处理
     *
     * @param element  需要进行匹配的元素
     * @param elements 匹配之后的结果
     */
    public void matching(Element element, LinkedList<Element> elements) {
        if (element == null || elements == null)
            return;
        matchingElement(element, elements);
    }

    /**
     * 对元素进行选择，把选择结果添加到元素列表中
     *
     * @param element  需要进行选择的元素
     * @param elements 选择之后的结果
     */
    abstract void selectElement(Element element, Queue<Element> elements);

    /**
     * 仅对元素本身进行选择，如果匹配则添加到元素列表中，否则不做处理
     *
     * @param element  需要进行匹配的元素
     * @param elements 匹配之后的结果
     */
    abstract void matchingElement(Element element, Queue<Element> elements);


    /**
     * 序列化选择器节点
     *
     * @param string 序列化字符串
     */
    public abstract void stringify(StringBuilder string);

    /**
     * 将选择器节点序列化
     *
     * @return 序列化后的字符串
     */
    public String stringify() {
        StringBuilder string = new StringBuilder();
        stringify(string);
        return string.toString();
    }

    @Override
    public String toString() {
        return stringify();
    }
}
